001 /*
002 * Copyright 2004-2005 Stephen J. McConnell.
003 * Copyright 2004 Niclas Hedhman.
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
014 * implied.
015 *
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 */
019
020 package net.dpml.transit;
021
022 import java.io.File;
023 import java.io.IOException;
024 import java.io.InputStream;
025 import java.io.OutputStream;
026
027 import net.dpml.transit.artifact.ArtifactAlreadyExistsException;
028
029 /**
030 * The CacheHandler interface defines the contract for classes capable of
031 * supporting the cache management aspects of a transit system. Cache management
032 * encompasses the retreval of resources based on artifact identifiers. A cache
033 * manager implementations may provide varying levels of quality-of-services.
034 * Selection of a cache manager is defined under the transit cache configuration
035 * properties.
036 *
037 * @author <a href="http://www.dpml.net">The Digital Product Meta Library</a>
038 * @version 1.0.0
039 */
040 public interface CacheHandler
041 {
042 /**
043 * Return the cache directory.
044 * @param artifact the artifact to resolve
045 * @return the working cache directory
046 * @exception IOException if an IO error occurs
047 */
048 File getLocalFile( Artifact artifact ) throws IOException;
049
050 /**
051 * Initialization of the cache handler. This operation is invoked by
052 * the transit context following the establishment of bootstrap
053 * services. During initialization the implementation loads any custom
054 * resource hosts.
055 *
056 * @exception IOException if an IO error occurs
057 */
058 void initialize() throws IOException;
059
060 /**
061 * Attempts to download and cache a remote artifact using a set of remote
062 * repositories.
063 *
064 * @param artifact the artifact to retrieve and cache
065 * @return a file referencing the local resource
066 * @exception IOException if an IO error occurs
067 * @exception TransitException is a transit system error occurs
068 */
069 InputStream getResource( Artifact artifact )
070 throws IOException, TransitException;
071
072 /**
073 * Attempts to download and cache a remote artifact using a set of remote
074 * repositories.
075 * <p>
076 * This method allows an internal reference to be passed to the
077 * cache handler and it is expected to return the InputStream of the
078 * internal item inside Jar/Zip files. If this method is called, the
079 * implementation can assume that the artifact is a Zip file.
080 * </p>
081 *
082 * @param artifact the artifact to retrieve and cache
083 * @param internalReference referencing a item within the artifact. This
084 * argument may start with "!" or "!/", which should be ignored.
085 * @return a file referencing the local resource
086 * @exception IOException if an IO error occurs
087 * @exception TransitException is a transit system error occurs
088 */
089 InputStream getResource( Artifact artifact, String internalReference )
090 throws IOException, TransitException;
091
092 /** Creates an output stream to where the artifact content can be written
093 * to.
094 * <p>
095 * If the artifact already exists, a <code>ArtifactAlreadyExistsException</code>
096 * will be thrown. If the directory doesn't exists, it will be created.
097 * The CacheHandler is responsible to recognize the completion of the
098 * writes through the <code>close()</code> method in the output stream,
099 * and do any post-processing there.
100 * </p>
101 * @param artifact the artifact
102 * @return an output stream
103 * @exception NullArgumentException if the artifact argument is null.
104 * @exception ArtifactAlreadyExistsException if the artifact already exists in the cache.
105 * @exception IOException if an IO error occurs
106 */
107 OutputStream createOutputStream( Artifact artifact )
108 throws NullArgumentException, ArtifactAlreadyExistsException, IOException;
109
110 /**
111 * Return the layout used by the cache.
112 * @return the cache layout
113 */
114 Layout getLayout();
115
116 /**
117 * Return the layout registry.
118 * @return the layout registry.
119 */
120 LayoutRegistry getLayoutRegistry();
121
122 /**
123 * Return the current cache directory.
124 * @return the cache directory.
125 */
126 File getCacheDirectory();
127 }